// 老师想给孩子们分发糖果，有 N 个孩子站成了一条直线，老师会根据每个孩子的表现，预先给他们评分。

// 你需要按照以下要求，帮助老师给这些孩子分发糖果：

// 每个孩子至少分配到 1 个糖果。
// 相邻的孩子中，评分高的孩子必须获得更多的糖果。
// 那么这样下来，老师至少需要准备多少颗糖果呢？


const candy = function (ratings: number[]): number {
    const countArr: number[] = new Array(ratings.length).fill(1); // 计数数组
    // 第一轮遍历，如果当前元素比左边大那就多发一颗糖
    for (let i = 1; i < ratings.length; i++) {
        if (ratings[i] > ratings[i - 1]) {
            countArr[i] = countArr[i - 1] + 1;
        }
    }
    let count: number = countArr[countArr.length - 1];// 将计数变量初始化
    // 第二轮遍历，如果当前元素比右边大那，就多发一颗糖，但要注意冲突
    for (let i = ratings.length - 2; i >= 0; i--) {
        if (ratings[i] > ratings[i + 1]) {
            // 这里可能引起发糖数的冲突，取最大值可以同时满足第一、二轮遍历的条件
            countArr[i] = Math.max(countArr[i + 1] + 1, countArr[i]);
        }
        count += countArr[i];// 统计计数变量
    }
    return count;
};

candy(
    [1, 3, 4, 5, 2])


// 我们可以将这道题目抽象成两道具体的数学规则：
// 设学生 A 和学生 B 左右相邻，A 在 B 左边
// 1. 当B比A分高时，B的糖比A要多。
// 2. 当A比B分高时，A的糖比B要多。
// 这道题目要求的每个同学拿到的糖数，且使就是要求规则同时满足（1）、（2）
// 如果能抽象到这里，这道题目就比较好解决了
// 首先从左至右遍历学生成绩，学生最少肯定时要拿到一颗糖的。
// 如果当前元素比左边大，那就当前学生就至少要比左边的学生多发一颗糖
// 然后再从右至左遍历学生成绩，如果当前学生成绩比右边大，那理应最少也要比右边多发一颗糖
// 但这里要注意可能会和第一遍遍历形成冲突，出现覆盖第一轮规则的结果。
// 我们在第二轮遍历时，对应学生糖果数的最大值，这样则同时满足左规则和右规则，即得到每个同学的最少糖果数量。
// 之后返回统计计数变量即可。